#ifndef _MY_UTTL_
#define _MY_UTIL_
#include<iostream>
#include<fstream>
#include<sstream>
#include<memory>
#include<string>
#include<unistd.h>
#include<sys/stat.h>
#include<jsoncpp/json/json.h>

namespace aod{
	class FileUtil{//文件工具类
		private:
			std::string _name;//文件路径名称
		public:
			FileUtil(const std::string name):_name(name){}
			bool Exists(){//判断文件是否存在
				int ret=access(_name.c_str(),F_OK);//access的F_OK专门用于检测文件是否存在--存在则返回0
				if(ret!=0){
					std::cout<<"file is not exists!\n";
					return false;
				}
				return true;
			}
			size_t Size(){//获取文件大小
				if(this->Exists()==false){
					return 0;
				}
				struct stat st;
				//stat接口用于获取文件属性，其中st_size就是文件大小成员
				int ret=stat(_name.c_str(),&st);
				if(ret!=0){
					std::cout<<"get file stat failed!\n";
					return 0;
				}
				return st.st_size;
			}
			bool GetContent(std::string *body){//文件数据读取到body中
				std::ifstream ifs;
				ifs.open(_name,std::ios::binary);
				if(ifs.is_open()==false){
					std::cout<<"open file failed!\n";
					return false;
				}
				size_t flen=this->Size();
				body->resize(flen);
				ifs.read(&(*body)[0],flen);
				if(ifs.good()==false){
					std::cout<<"read file content failed!\n";
					ifs.close();
					return false;
				}
				ifs.close();
				return true;
			}
			bool SetContent(const std::string&body){//向文件写入数据
				std::ofstream ofs;
				ofs.open(_name,std::ios::binary);
				if(ofs.is_open()==false){
					std::cout<<"open file failed!\n";
					return false;
				}
				ofs.write(body.c_str(),body.size());
				if(ofs.good()==false){
					std::cout<<"write file content failed!\n";
					ofs.close();
					return false;
				}
				ofs.close();
				return true;
			}
			bool CreateDirectory(){//针对目录时创建目录
				if(this->Exists()){
					return true;
				}
				mkdir(_name.c_str(),0777);
				return true;
			}
	};
	class JsonUtil{//Json工具类
		public:
			static bool Serialize(const Json::Value &value,std::string *body){//序列化--将多个数据对象组织成为json格式字符串
			Json::StreamWriterBuilder swb;
			std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
		   
		    std::stringstream ss;
			int ret=sw->write(value,&ss);
			if(ret!=0){
				std::cout<<"Serialize faiked!\n";
				return false;
			}
			*body=ss.str();
			return true;
			}
			static bool UnSerialize(const std::string &body,Json::Value *value){//反序列化--将json格式字符串解析成多个数据对象
				Json::CharReaderBuilder crb;
				std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

				std::string err;
				bool ret=cr->parse(body.c_str(),body.c_str()+body.size(),value,&err);
				if(ret==false){
					std::cout<<"UnSerialize failed!\n";
					return false;
				}
				return true;
			}
	};
}
#endif
